const { db } = require("../Schema/config");

//通过db对象创建操作文章表的模型对象
const ArticleSchema = require("../Schema/article");
const Article = db.model("articles", ArticleSchema);

//获取用户Schema，为了拿到获取操作User表的对象
const UserSchema = require("../Schema/user");
const User = db.model("users", UserSchema);

//通过db对象创建操作评论表的模型对象
const CommentSchema = require("../Schema/comment");
const Comment = db.model("comments", CommentSchema);

//返回文章发表页
exports.addPage = async ctx => {
  await ctx.render("add-article", {
    title: "文章发表页",
    session: ctx.session
  });
};

//文章的发表（保存到数据库）
exports.add = async (ctx, next) => {
  if (ctx.session.isNew) {
    //为true就不需要查询数据库
    return (ctx.body = {
      msg: "用户未登录",
      status: 0
    });
  }

  //用户已登录,在登录情况下，post发过来的数据
  const data = ctx.request.body;

  //添加文章作者
  data.author = ctx.session.uid;
  await new Promise((resolve, reject) => {
    const pageData = new Article(data);
    pageData.save((err, data) => {
      if (err) return reject(err);
      resolve(data);
    });
  })
    .then(data => {
      ctx.body = {
        msg: "保存成功",
        status: 1
      };
    })
    .catch(err => {
      ctx.body = {
        msg: "发表失败",
        status: 0
      };
    });
};

//获取文章列表
exports.getList = async (ctx, next) => {
  //查询每篇文章对应的作者的头像
  //获取动态路由的id值，ctx.params.id
  let page = ctx.params.id || 1;
  page--;
  //exec()表示执行上面的操作
  const artList = await Article.find()
    .sort("-createdTime") //前面加减号，表示按照这个字段查询，进行降序排列
    .skip(5 * page) //用于跳过多少条数据
    .limit(5) //筛选后面的多少条
    .populate({
      //mongoose 用于连表查询，每一条数据链接哪张表
      path: "author", //链接的表的名称，因为author在Schema里面已经连过表了，所以我们直接填author字段就可以了
      select: "username _id avatar" //需要查询的链接的表的里面的哪些字段
    })
    .then(res => {
      return res;
    })
    .catch(err => {
      console.log(err);
    });

  //获取表里面最大的数量
  const maxNum = await Article.estimatedDocumentCount((err, data) =>
    err ? console.log(err) : data
  );
  console.log(maxNum);
  await ctx.render("index", {
    title: "实战博客首页",
    session: ctx.session,
    artList: artList,
    maxNum: maxNum
  });
};

//获取文章详情
exports.details = async (ctx, next) => {
  //取动态路由里的ID值
  const _id = ctx.params.id;
  const article = await Article.findById(_id)
    .populate({
      path: "author",
      select: "username avatar"
    })
    .then(data => data);

  //查找跟文章相关的评论
  const comment = await Comment
    .find({article: _id})
    .sort("-created")
    .populate("form", "username avatar")
    .then(data => data)
    .catch(err => {
      console.log(err)
    })

  console.log(comment);
  await ctx.render("article", {
    title: article.title,
    session: ctx.session,
    article,
    comment
  });
};
